#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>
#include <ctype.h>
#include <iostream>
#include "db.h"
#include "files.h"

static const char *progname;

static void usage(void)
{
    printf("用法:\n");
    printf("  %s -t DB [选项]\n", progname);
    printf("  -a, --datasource     连接数据库配置文件 (仅用于 DB 类型)\n");
    printf("  %s -t files -s SOURCE -d DEST [选项]\n", progname);
    printf("\n选项:\n");
    printf("  -t, --type     指定操作类型: DB 或 files\n");
    printf("  -s, --source   源文件路径 (仅用于 files 类型)\n");
    printf("  -d, --dest     目标文件路径 (仅用于 files 类型)\n");
    printf("  -h, --help     显示此帮助信息并退出\n");
    printf("  -V, --version  输出版本信息并退出\n");
}

int main(int argc, char *argv[])
{
    char *source = NULL;
    char *datasource = NULL;
    char *dest = NULL;
    char *type = NULL;
    int c;
    int option_index = 0;

    progname = argv[0];

    static struct option long_options[] = {
        {"type", required_argument, 0, 't'},
        {"source", required_argument, 0, 's'},
        {"datasource", required_argument, 0, 'a'},
        {"dest", required_argument, 0, 'd'},
        {"help", no_argument, 0, 'h'},
        {"version", no_argument, 0, 'V'},
        {0, 0, 0, 0}};

    // 解析命令行参数
    while ((c = getopt_long(argc, argv, "t:s:a:d:hV", long_options, &option_index)) != -1)
    {
        switch (c)
        {
        case 't':
            type = optarg;
            break;
        case 's':
            source = optarg;
            break;
        case 'a':
            datasource = optarg;
            break;
        case 'd':
            dest = optarg;
            break;
        case 'h':
            usage();
            exit(EXIT_SUCCESS);
        case 'V':
            printf("%s (版本 1.0)\n", progname);
            exit(EXIT_SUCCESS);
        default:
            usage();
            exit(EXIT_FAILURE);
        }
    }

    // 验证必要参数
    if (!type)
    {
        fprintf(stderr, "%s: 错误：必须指定 -t/--type 参数\n", progname);
        usage();
        exit(EXIT_FAILURE);
    }

    // 检查 type 是否为 "DB" 或 "files"（大小写不敏感）
    int is_db = strcasecmp(type, "DB") == 0;
    int is_files = strcasecmp(type, "files") == 0;

    if (!is_db && !is_files)
    {
        fprintf(stderr, "%s: 错误：无效的类型 '%s'，必须是 'DB' 或 'files'\n", progname, type);
        exit(EXIT_FAILURE);
    }

    // 当 type 为 DB 时，必须提供 datasource
    if (is_db && (!datasource))
    {
        fprintf(stderr, "%s: 错误：使用 'DB' 类型时必须指定 -a/--datasource 参数\n", progname);
        usage();
        exit(EXIT_FAILURE);
    }

    // 当 type 为 files 时，必须提供 source 和 dest
    if (is_files && (!source || !dest))
    {
        fprintf(stderr, "%s: 错误：使用 'files' 类型时必须指定 -s/--source 和 -d/--dest 参数\n", progname);
        usage();
        exit(EXIT_FAILURE);
    }

    // 执行对应操作
    if (is_db)
    {
        int status;
        status = dbcompareConfigs(datasource);
        if (status != 0)
    {
        std::cerr << "连接数据库建立表出错: "<< std::endl;
        return EXIT_FAILURE;
    }
    }
    else
    {
        readFiles(source, dest);
    }

    return EXIT_SUCCESS;
}